//
// Created by Administrator on 2021/8/10.

//给定一个非负整数数组 nums ，你最初位于数组的 第一个下标 。
//
//数组中的每个元素代表你在该位置可以跳跃的最大长度。
//
//判断你是否能够到达最后一个下标。
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <string>
#include <climits>

using namespace std;

class Solution {
public:
    bool canJump(vector<int> &nums) {
        vector<bool> dp(nums.size(), false);
        dp[0] = true;
        for (int i = 0; i < nums.size(); ++i) {
            // 如果这一格能到 那么后面1~nums[i]格都能到
            if (dp[i]) {
                for (int j = 1; j <= nums[i] and i + j < nums.size(); ++j) {
                    dp[i + j] = true;
                }
            }
        }
        return dp.back();
    }

    // 超时
    bool canJump2(vector<int> &nums) {
        int n = (int) nums.size();
        int rightMost = 0;  // 能到达的最右端
        for (int i = 0; i < n; ++i) {
            if (i <= rightMost) {
                rightMost = max(rightMost, i + nums[i]);
                if (rightMost >= n - 1)
                    return true;
            }
        }
        return false;
    }
};

int main() {
    vector<int> nums{3, 2, 1, 0, 4};
    Solution solution;
    cout << solution.canJump(nums) << endl;
    return 0;
}
